Investigating Second Eigenvalue

  if (require("PageRank")) {
      library(PageRank)
    }else{
      devtools::install_github("ryangreenup/PageRank")
      library(PageRank)
    }

  library(pacman)
  pacman::p_load(PageRank, devtools, Matrix, igraph, mise, tidyverse, rgl, latex2exp)
#  mise()

Looking at Density

Constants

Define some constants

n <- 20
p <- 1:n/n
beta <- 1:n/n
beta <- runif(n)*100
#sz <- 1:n/n+10
sz <- (1:n/n)*100+10
input_var <- expand.grid("n" = n, "p" = p, "beta" = beta, "size" = sz)
input_var

Function to Build Graph

random_graph <- function(n, p, beta, size) {
      g1 <- igraph::erdos.renyi.game(n = sz, p)
      A <- igraph::get.adjacency(g1) # Row to column
      A <- Matrix::t(A)

      A_dens <- mean(A)
      T      <- PageRank::power_walk_prob_trans(A)
      tr     <- sum(diag(T))
      e2     <- eigen(T, only.values = TRUE)$values[2] # R orders by descending magnitude
      A_det  <- det(T)
      return(c(abs(e2), A_dens, A_det, tr))
}

Return results

Map the function

nc <- length(random_graph(1, 1, 1, 1))
Y <- matrix(ncol = nc, nrow = nrow(input_var))
for (i in 1:nrow(input_var)) {
  X <- as.vector(input_var[i,])
  Y[i,] <-  random_graph(X$n, X$p, X$beta, X$size)
}
if (sum(abs(Y) != abs(Re(Y))) == 0) {
  Y <- Re(Y)
}
nrow(input_var)
[1] 8000
nrow(Y)
[1] 8000
Y <- as.data.frame(Y); colnames(Y) <- c("eigenvalue2", "density", "determinant", "trace")
(data <- cbind(input_var, Y)) %>% head()
data <- data[data$density!=0,]

Plot Results

mod <- lm(eigenvalue2 ~ poly(density, 1), data = data)
mod$residuals %>%  hist(breaks = 90)

hist(rnorm(3000), breaks = 100)

plot(mod)

NA

This is interesting, lets look at a snapshot of it:

pairs(data)

cor(data)
the standard deviation is zero
             n             p
n            1            NA
p           NA  1.0000000000
beta        NA -0.0003878828
size        NA  0.0002679644
eigenvalue2 NA -0.9212105217
density     NA  0.9904278229
determinant NA -0.0165548871
trace       NA -0.8625597471
                     beta          size
n                      NA            NA
p           -0.0003878828  0.0002679644
beta         1.0000000000  0.0003062037
size         0.0003062037  1.0000000000
eigenvalue2  0.0019516406 -0.0001260856
density      0.0007147401  0.0013455370
determinant  0.0014073128  0.0031502969
trace       -0.0017016803 -0.0040214793
              eigenvalue2       density
n                      NA            NA
p           -0.9212105217  0.9904278229
beta         0.0019516406  0.0007147401
size        -0.0001260856  0.0013455370
eigenvalue2  1.0000000000 -0.9287234046
density     -0.9287234046  1.0000000000
determinant  0.0211222176 -0.0164753631
trace        0.6696925620 -0.8728746605
             determinant        trace
n                     NA           NA
p           -0.016554887 -0.862559747
beta         0.001407313 -0.001701680
size         0.003150297 -0.004021479
eigenvalue2  0.021122218  0.669692562
density     -0.016475363 -0.872874661
determinant  1.000000000 -0.005188244
trace       -0.005188244  1.000000000
library(corrplot)
corrplot(cor(data), method = "ellipse", type = "lower")
the standard deviation is zero

names(data)
[1] "n"           "p"          
[3] "beta"        "size"       
[5] "eigenvalue2" "density"    
[7] "determinant" "trace"      
library(scatterplot3d)
shapes = c(16, 17, 18) 
shapes <- shapes[as.numeric(iris$Species)]
scatterplot3d(iris[,1:3], pch = shapes)
d <- data[,names(data) %in% c("eigenvalue2", "density", "determinant")]
scatterplot3d(d, angle = 10)
library(plotly)

mtcars$am[which(mtcars$am == 0)] <- 'Automatic'
mtcars$am[which(mtcars$am == 1)] <- 'Manual'
mtcars$am <- as.factor(mtcars$am)

d <- data[sample(1:nrow(data), 1000),]

fig <- plot_ly(d, x = ~determinant, y = ~density, z = ~eigenvalue2)
fig <- fig %>% add_markers(size = 1)
fig <- fig %>% layout(scene = list(xaxis = list(title = 'Weight'),
                     yaxis = list(title = 'Gross horsepower'),
                     zaxis = list(title = '1/4 mile time')))

fig

NA
ggplot(data) +
  geom_point(mapping = aes(x = density, y = eigenvalue2, size = beta, color = size )) +
  scale_size_continuous(range = c(0.1,1)) +
  labs(x = "Density of Adjacency Matrix", y = TeX("$\\xi_2$ of $T_{PW}$")) +
  guides(size = FALSE, col = FALSE)

well the spread is heteroskedastic so let’s log transform it:

ggplot(data, aes(x = density, y = log(eigenvalue2))) +
  geom_point(mapping = aes(size = size, color = p, shape = factor(n))) +
#  stat_smooth() +
  scale_size_continuous(range = c(0.1,1.5)) +
  labs(x = "Density of Adjacency Matrix", y = "Second Eigenvalue of Power Walk Transition Probability Matrix")

We could probably model this with a quadratic:

mod_x1 <- lm(log(eigenvalue2) ~ poly(density, 1), data = data)
data$x1 <- predict(mod_x1)

mod_x2 <- lm(log(eigenvalue2) ~ poly(density, 2), data = data)
data$x2 <- predict(mod_x2)

mod_x4 <- lm(log(eigenvalue2) ~ poly(density, 4), data = data)
data$x4 <- predict(mod_x4)

mod_xl <- lm(log(eigenvalue2) ~ log(1-density), data = data)
data$xl <- predict(mod_xl)

mod_df <- data
mod_df_long <- pivot_longer(mod_df, cols = c(x1, x2, x4, xl), names_to = "Model_Type", values_to = "eigenvalue2_mod")
mod_df_long$eigenvalue2_log <- log(mod_df_long$eigenvalue2)


print(c("MSE Linear"  = mean(mod_x1$residuals^2),
        "MSE Quadratic" = mean(mod_x2$residuals^2),
        "MSE Quartic" = mean(mod_x4$residuals^2),
        "MSE Logarithmic" = mean(mod_xl$residuals^2)
        ), 2)
     MSE Linear   MSE Quadratic     MSE Quartic MSE Logarithmic 
          0.078           0.031           0.013           0.023 
ggplot(mod_df_long, aes(x = density)) +
  geom_point(aes(y = eigenvalue2_log), fill = "lightblue", col = "black", size = 0.1, alpha = 0.2) +
  geom_smooth(aes(y = eigenvalue2_mod, col = Model_Type), size = 0.9) +
  labs(col = c("Model \nType")) +
  scale_color_discrete(labels = c("Linear", "Quadratic", "Quartic", "Logarithmic")) +
  labs(x = "Density of A", y = TeX("$\\log \\left( \\xi_2 \\right$ of $\\mathbf{T}$")) +
  theme_linedraw()

data.frame("Model" = c("Linear", "Logarithmic"))
ggplot()
# TODO Change the colour of each model by using pivot_longer
# TODO Make a plot of degree vs RSS, comment that the lack of elbo is evidence to regect
# TODO Try a negative log, any luck? with that
# TODO Does this vary by beta?
# TODO Write it up in a report
# DONE What about a sqrt transform and then a linear model?
  # Leaves too much variance
ggplot(data, aes(x = density, y = log(eigenvalue2))) +
  geom_point(mapping = aes(size = size, alpha = 0.01,  color = size, shape = factor(n))) +
#  stat_smooth() +
  scale_size_continuous(range = c(0.1,1.5)) +
  labs(x = "Density of Adjacency Matrix [ mean(A) ]", y = TeX("$\\log\\left( \\xi_2 \\right)$ of T")) +
  geom_line(aes(x = density, y = x1, lwd = 2)) +
  geom_line(aes(x = density, y = xl, lwd = 3)) 

#  geom_line(aes(x = density, y = x3, lwd = 0.5)) +
#  geom_line(aes(x = density, y = x4, lwd = 0.5)) +
#  geom_line(aes(x = density, y = x5, lwd = 0.5)) +
# geom_line(aes(x = density, y = x6, lwd = 36)) 

Look at the Trace of T

ggplot(data, aes(x = trace , y = log(eigenvalue2))) +
  geom_point(mapping = aes(size = size, color = p, shape = factor(n))) +
#  stat_smooth() +
  scale_size_continuous(range = c(0.1,1.5)) +
  labs(x = "Trace of Transition Matrix", y = TeX("$\\log\\left( \\xi_2 \\right)$ of \\mathbf{W}"))

mod_df <- data

mod_hyp <- lm(log(eigenvalue2) ~ I(trace^(-1)), data = data)
mod_df$hyp <- predict(mod_hyp)

mod_log <- lm(log(eigenvalue2) ~ log(trace), data = data)
mod_df$log <- predict(mod_log)
ggplot(mod_df, aes(x = trace, y = log(eigenvalue2))) +
  geom_point(mapping = aes(size = size, alpha = 0.01,  color = size, shape = factor(n))) +
#  stat_smooth() +
  scale_size_continuous(range = c(0.1,1.5)) +
  labs(x = "Trace of A", y = TeX("$\\log\\left( \\xi_2 \\right)$ of T")) +
  geom_line(aes(x = trace, y = hyp, lwd = 2)) +
  geom_line(aes(x = trace, y = log, lwd = 2))


mod_df <- data

mod_hyp <- lm(log(eigenvalue2) ~ 0 + I(trace^(-1)), data = data)
mod_df$hyp <- predict(mod_hyp)

mod_log <- lm(log(eigenvalue2) ~ 0 + log(trace), data = data)
mod_df$log <- predict(mod_log)


mod_df_long <- pivot_longer(mod_df, cols = c(hyp, log), names_to = "Model_Type", values_to = "eigenvalue2_mod")
mod_df_long$eigenvalue2_log <- log(mod_df_long$eigenvalue2)


print(c("MSE Hyperbolic"  = mean(mod_hyp$residuals^2),
        "MSE Logarithmic" = mean(mod_log$residuals^2)), 2)

ggplot(mod_df_long, aes(x = trace)) +
  geom_point(shape = 23, aes(y = eigenvalue2_log), fill = "lightblue", col = "black", size = 0.7, alpha = 0.4) +
  geom_line(aes(y = eigenvalue2_mod, col = Model_Type), size = 1) +
  labs(col = c("Model \nType")) +
  scale_color_manual(labels = c("Hyperbolic", "Logarithmic"),
                     values = c("indianred", "royalblue")) +
  labs(x = "Trace of A", y = TeX("$\\log \\left( \\xi_2 \\right$ of $\\mathbf{T}$"))

  theme_linedraw()
List of 93
 $ line                      :List of 6
  ..$ colour       : chr "black"
  ..$ size         : num 0.5
  ..$ linetype     : num 1
  ..$ lineend      : chr "butt"
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ rect                      :List of 5
  ..$ fill         : chr "white"
  ..$ colour       : chr "black"
  ..$ size         : num 0.5
  ..$ linetype     : num 1
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ text                      :List of 11
  ..$ family       : chr ""
  ..$ face         : chr "plain"
  ..$ colour       : chr "black"
  ..$ size         : num 11
  ..$ hjust        : num 0.5
  ..$ vjust        : num 0.5
  ..$ angle        : num 0
  ..$ lineheight   : num 0.9
  ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ title                     : NULL
 $ aspect.ratio              : NULL
 $ axis.title                : NULL
 $ axis.title.x              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.x.top          :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 0
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.x.bottom       : NULL
 $ axis.title.y              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : num 90
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.y.left         : NULL
 $ axis.title.y.right        :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 0
  ..$ angle        : num -90
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text                 :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : chr "black"
  ..$ size         : 'rel' num 0.8
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x               :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x.top           :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 0
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x.bottom        : NULL
 $ axis.text.y               :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 1
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.y.left          : NULL
 $ axis.text.y.right         :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.ticks                :List of 6
  ..$ colour       : chr "black"
  ..$ size         : 'rel' num 0.5
  ..$ linetype     : NULL
  ..$ lineend      : NULL
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ axis.ticks.x              : NULL
 $ axis.ticks.x.top          : NULL
 $ axis.ticks.x.bottom       : NULL
 $ axis.ticks.y              : NULL
 $ axis.ticks.y.left         : NULL
 $ axis.ticks.y.right        : NULL
 $ axis.ticks.length         : 'simpleUnit' num 2.75points
  ..- attr(*, "unit")= int 8
 $ axis.ticks.length.x       : NULL
 $ axis.ticks.length.x.top   : NULL
 $ axis.ticks.length.x.bottom: NULL
 $ axis.ticks.length.y       : NULL
 $ axis.ticks.length.y.left  : NULL
 $ axis.ticks.length.y.right : NULL
 $ axis.line                 : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ axis.line.x               : NULL
 $ axis.line.x.top           : NULL
 $ axis.line.x.bottom        : NULL
 $ axis.line.y               : NULL
 $ axis.line.y.left          : NULL
 $ axis.line.y.right         : NULL
 $ legend.background         :List of 5
  ..$ fill         : NULL
  ..$ colour       : logi NA
  ..$ size         : NULL
  ..$ linetype     : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ legend.margin             : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
  ..- attr(*, "unit")= int 8
 $ legend.spacing            : 'simpleUnit' num 11points
  ..- attr(*, "unit")= int 8
 $ legend.spacing.x          : NULL
 $ legend.spacing.y          : NULL
 $ legend.key                :List of 5
  ..$ fill         : chr "white"
  ..$ colour       : logi NA
  ..$ size         : NULL
  ..$ linetype     : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ legend.key.size           : 'simpleUnit' num 1.2lines
  ..- attr(*, "unit")= int 3
 $ legend.key.height         : NULL
 $ legend.key.width          : NULL
 $ legend.text               :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.8
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ legend.text.align         : NULL
 $ legend.title              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ legend.title.align        : NULL
 $ legend.position           : chr "right"
 $ legend.direction          : NULL
 $ legend.justification      : chr "center"
 $ legend.box                : NULL
 $ legend.box.just           : NULL
 $ legend.box.margin         : 'margin' num [1:4] 0cm 0cm 0cm 0cm
  ..- attr(*, "unit")= int 1
 $ legend.box.background     : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ legend.box.spacing        : 'simpleUnit' num 11points
  ..- attr(*, "unit")= int 8
 $ panel.background          :List of 5
  ..$ fill         : chr "white"
  ..$ colour       : logi NA
  ..$ size         : NULL
  ..$ linetype     : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ panel.border              :List of 5
  ..$ fill         : logi NA
  ..$ colour       : chr "black"
  ..$ size         : 'rel' num 1
  ..$ linetype     : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ panel.spacing             : 'simpleUnit' num 5.5points
  ..- attr(*, "unit")= int 8
 $ panel.spacing.x           : NULL
 $ panel.spacing.y           : NULL
 $ panel.grid                :List of 6
  ..$ colour       : chr "black"
  ..$ size         : NULL
  ..$ linetype     : NULL
  ..$ lineend      : NULL
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ panel.grid.major          :List of 6
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.1
  ..$ linetype     : NULL
  ..$ lineend      : NULL
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ panel.grid.minor          :List of 6
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.05
  ..$ linetype     : NULL
  ..$ lineend      : NULL
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ panel.grid.major.x        : NULL
 $ panel.grid.major.y        : NULL
 $ panel.grid.minor.x        : NULL
 $ panel.grid.minor.y        : NULL
 $ panel.ontop               : logi FALSE
 $ plot.background           :List of 5
  ..$ fill         : NULL
  ..$ colour       : chr "white"
  ..$ size         : NULL
  ..$ linetype     : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ plot.title                :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 1.2
  ..$ hjust        : num 0
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ plot.title.position       : chr "panel"
 $ plot.subtitle             :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ plot.caption              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.8
  ..$ hjust        : num 1
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 5.5points 0points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ plot.caption.position     : chr "panel"
 $ plot.tag                  :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 1.2
  ..$ hjust        : num 0.5
  ..$ vjust        : num 0.5
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ plot.tag.position         : chr "topleft"
 $ plot.margin               : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
  ..- attr(*, "unit")= int 8
 $ strip.background          :List of 5
  ..$ fill         : chr "black"
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ linetype     : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ strip.background.x        : NULL
 $ strip.background.y        : NULL
 $ strip.placement           : chr "inside"
 $ strip.text                :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : chr "white"
  ..$ size         : 'rel' num 0.8
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 4.4points 4.4points 4.4points 4.4points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ strip.text.x              : NULL
 $ strip.text.y              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : num -90
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ strip.switch.pad.grid     : 'simpleUnit' num 2.75points
  ..- attr(*, "unit")= int 8
 $ strip.switch.pad.wrap     : 'simpleUnit' num 2.75points
  ..- attr(*, "unit")= int 8
 $ strip.text.y.left         :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : num 90
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 - attr(*, "class")= chr [1:2] "theme" "gg"
 - attr(*, "complete")= logi TRUE
 - attr(*, "validate")= logi TRUE

Model Chi Distribution

NOPE


chival <- dchisq(seq(from = 0, to = 40, length.out = 100), df = 10)*7
index  <- seq(from = 0, to = 2.2, length.out = 100)
chidata  <- data.frame(index = index, chi = chival)
ggplot(data) +
  geom_point(mapping = aes(x = density, y = eigenvalue2, size = beta, color = size, shape = factor(n))) +
  geom_line(data = chidata, mapping = aes(x = index, y = chi)) +
  scale_size_continuous(range = c(0.1,1)) +
  labs(x = "Density of Adjacency Matrix", y = "Second Eigenvalue of Power Walk Transition Probability Matrix")

Looking at Determinant

constants:

n <- 20
p <- 1:n/n
beta <- 1:n/n
beta <- runif(n)*100
sz <- ((1:n)/n)*100+10
input_var <- expand.grid("n" = n, "p" = p, "beta" = beta, "size" = sz)

functions:

random_graph <- function(n, p, beta, size) {
      g1 <- igraph::erdos.renyi.game(n = sz, p)
      A <- igraph::get.adjacency(g1) # Row to column
      A <- Matrix::t(A)

      A_dens <- mean(A)
      T      <- PageRank::power_walk_prob_trans(A)
      e2     <- eigen(T, only.values = TRUE)$values[2] # R orders by descending magnitude
      A_det  <- det(A)
      return(c(abs(abs(e2)-0.4), abs(A_det), A_dens))
}

Map the function

nc <- length(random_graph(1, 1, 1, 1))
Y <- matrix(ncol = nc, nrow = nrow(input_var))
for (i in 1:nrow(input_var)) {
  X <- as.vector(input_var[i,])
  Y[i,] <-  random_graph(X$n, X$p, X$beta, X$size)
}
if (sum(abs(Y) != abs(Re(Y))) == 0) {
  Y <- Re(Y)
}
nrow(input_var)
nrow(Y)
Y <- as.data.frame(Y); colnames(Y) <- c("eigenvalue2", "determinant")
data <- cbind(input_var, Y)
ggplot(data) +
  geom_point(mapping = aes(x = determinant, y = eigenvalue2, size = size, color = beta, shape = factor(n))) +
  scale_size_continuous(range = c(0.1,1)) +
  labs(y = "||e2|-0.4|", x = TeX("$\\left\\lvert A \\right\\rvert $"))
g1 <- igraph::erdos.renyi.game(n = sz, p)
coords <- layout_with_fr(g1, dim = 3)
# plot(g1)
rglplot(g1, layout=coords, size = 0.1)

## Not run: 
g <- make_lattice( c(5,5,5) )
coords <- layout_with_fr(g, dim=3)
rglplot(g, layout=coords)

## End(Not run)
n <- sz <- size <-  10^3
p <- 0.
g1 <- igraph::erdos.renyi.game(n = sz, p)
A <- igraph::get.adjacency(g1) # Row to column
A <- Matrix::t(A)
det(A)
ggplot(data) +
  geom_point(mapping = aes(x = size, y = determinant, size = size, color = beta, shape = factor(n))) +
  scale_size_continuous(range = c(0.1,1)) +
  labs(x = "size", y = "determinant")

Get Different Data

constants:

n <- 10
p <- 1:n/n
beta <- 1:n/n
beta <- runif(n)*100
sz <- 1:n/n+100
input_var <- expand.grid("n" = n, "p" = p, "beta" = beta, "size" = sz)

functions:

random_graph <- function(n, p, beta, size) {
      g1 <- igraph::erdos.renyi.game(n = sz, p)
      A <- igraph::get.adjacency(g1) # Row to column
      A <- Matrix::t(A)

      A_dens <- mean(A)
      T      <- PageRank::power_walk_prob_trans(A)
      e2     <- eigen(T, only.values = TRUE)$values[2] # R orders by descending magnitude
      A_det  <- det(A)
      return(c(abs(e2), A_det, A_dens))
}

Map the function

nc <- length(random_graph(1, 1, 1, 1))
Y <- matrix(ncol = nc, nrow = nrow(input_var))
for (i in 1:nrow(input_var)) {
  X <- as.vector(input_var[i,])
  Y[i,] <-  random_graph(X$n, X$p, X$beta, X$size)
}
if (sum(abs(Y) != abs(Re(Y))) == 0) {
  Y <- Re(Y)
}
nrow(input_var)
nrow(Y)
Y <- as.data.frame(Y); colnames(Y) <- c("eigenvalue2", "determinant")
data <- cbind(input_var, Y)

chival <- dchisq(seq(from = 0, to = 40, length.out = 100), df = 10)*7
index  <- seq(from = 0, to = 2.2, length.out = 100)
chidata  <- data.frame(index = index, chi = chival)
ggplot(data) +
  geom_point(mapping = aes(x = determinant, y = eigenvalue2, size = size, color = beta, shape = factor(n))) +
  scale_size_continuous(range = c(0.1,1)) +
  labs(x = "Density of Adjacency Matrix", y = "Second Eigenvalue of Power Walk Transition Probability Matrix")
g1 <- igraph::erdos.renyi.game(n = sz, p)
coords <- layout_with_fr(g1, dim = 3)
# plot(g1)
# rglplot(g1, layout=coords, size = 0.1)

## Not run: 
g <- make_lattice( c(5,5,5) )
coords <- layout_with_fr(g, dim=3)
rglplot(g, layout=coords)

## End(Not run)
n <- sz <- size <-  100
p <- 0.4
g1 <- igraph::erdos.renyi.game(n = sz, p)
A <- igraph::get.adjacency(g1) # Row to column
A <- Matrix::t(A)
det(A)
LS0tCnRpdGxlOiAiSW52ZXN0aWdhdGluZyBTZWNvbmQgRWlnZW52YWx1ZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBJbnZlc3RpZ2F0aW5nIFNlY29uZCBFaWdlbnZhbHVlCgpgYGB7cn0KICBpZiAocmVxdWlyZSgiUGFnZVJhbmsiKSkgewogICAgICBsaWJyYXJ5KFBhZ2VSYW5rKQogICAgfWVsc2V7CiAgICAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigicnlhbmdyZWVudXAvUGFnZVJhbmsiKQogICAgICBsaWJyYXJ5KFBhZ2VSYW5rKQogICAgfQoKICBsaWJyYXJ5KHBhY21hbikKICBwYWNtYW46OnBfbG9hZChQYWdlUmFuaywgZGV2dG9vbHMsIE1hdHJpeCwgaWdyYXBoLCBtaXNlLCB0aWR5dmVyc2UsIHJnbCwgbGF0ZXgyZXhwKQojICBtaXNlKCkKYGBgCgoKCiMjIExvb2tpbmcgYXQgRGVuc2l0eQoKIyMjIENvbnN0YW50cwoKRGVmaW5lIHNvbWUgY29uc3RhbnRzCgpgYGB7cn0KbiA8LSAyMApwIDwtIDE6bi9uCmJldGEgPC0gMTpuL24KYmV0YSA8LSBydW5pZihuKSoxMDAKI3N6IDwtIDE6bi9uKzEwCnN6IDwtICgxOm4vbikqMTAwKzEwCmlucHV0X3ZhciA8LSBleHBhbmQuZ3JpZCgibiIgPSBuLCAicCIgPSBwLCAiYmV0YSIgPSBiZXRhLCAic2l6ZSIgPSBzeikKaW5wdXRfdmFyCmBgYAoKIyMjIEZ1bmN0aW9uIHRvIEJ1aWxkIEdyYXBoCgpgYGB7cn0KcmFuZG9tX2dyYXBoIDwtIGZ1bmN0aW9uKG4sIHAsIGJldGEsIHNpemUpIHsKICAgICAgZzEgPC0gaWdyYXBoOjplcmRvcy5yZW55aS5nYW1lKG4gPSBzeiwgcCkKICAgICAgQSA8LSBpZ3JhcGg6OmdldC5hZGphY2VuY3koZzEpICMgUm93IHRvIGNvbHVtbgogICAgICBBIDwtIE1hdHJpeDo6dChBKQoKICAgICAgQV9kZW5zIDwtIG1lYW4oQSkKICAgICAgVCAgICAgIDwtIFBhZ2VSYW5rOjpwb3dlcl93YWxrX3Byb2JfdHJhbnMoQSkKICAgICAgdHIgICAgIDwtIHN1bShkaWFnKFQpKQogICAgICBlMiAgICAgPC0gZWlnZW4oVCwgb25seS52YWx1ZXMgPSBUUlVFKSR2YWx1ZXNbMl0gIyBSIG9yZGVycyBieSBkZXNjZW5kaW5nIG1hZ25pdHVkZQogICAgICBBX2RldCAgPC0gZGV0KFQpCiAgICAgIHJldHVybihjKGFicyhlMiksIEFfZGVucywgQV9kZXQsIHRyKSkKfQpgYGAKCiMjIyBSZXR1cm4gcmVzdWx0cwoKTWFwIHRoZSBmdW5jdGlvbgoKYGBge3J9Cm5jIDwtIGxlbmd0aChyYW5kb21fZ3JhcGgoMSwgMSwgMSwgMSkpClkgPC0gbWF0cml4KG5jb2wgPSBuYywgbnJvdyA9IG5yb3coaW5wdXRfdmFyKSkKZm9yIChpIGluIDE6bnJvdyhpbnB1dF92YXIpKSB7CiAgWCA8LSBhcy52ZWN0b3IoaW5wdXRfdmFyW2ksXSkKICBZW2ksXSA8LSAgcmFuZG9tX2dyYXBoKFgkbiwgWCRwLCBYJGJldGEsIFgkc2l6ZSkKfQppZiAoc3VtKGFicyhZKSAhPSBhYnMoUmUoWSkpKSA9PSAwKSB7CiAgWSA8LSBSZShZKQp9Cm5yb3coaW5wdXRfdmFyKQpucm93KFkpClkgPC0gYXMuZGF0YS5mcmFtZShZKTsgY29sbmFtZXMoWSkgPC0gYygiZWlnZW52YWx1ZTIiLCAiZGVuc2l0eSIsICJkZXRlcm1pbmFudCIsICJ0cmFjZSIpCihkYXRhIDwtIGNiaW5kKGlucHV0X3ZhciwgWSkpICU+JSBoZWFkKCkKZGF0YSA8LSBkYXRhW2RhdGEkZGVuc2l0eSE9MCxdCgpgYGAKCgojIyMgUGxvdCBSZXN1bHRzCgoKYGBge3J9Cm1vZCA8LSBsbShlaWdlbnZhbHVlMiB+IHBvbHkoZGVuc2l0eSwgMSksIGRhdGEgPSBkYXRhKQptb2QkcmVzaWR1YWxzICU+JSAgaGlzdChicmVha3MgPSA5MCkKaGlzdChybm9ybSgzMDAwKSwgYnJlYWtzID0gMTAwKQpwbG90KG1vZCkKCmBgYAoKClRoaXMgaXMgaW50ZXJlc3RpbmcsIGxldHMgbG9vayBhdCBhIHNuYXBzaG90IG9mIGl0OgoKYGBge3J9CnBhaXJzKGRhdGEpCmNvcihkYXRhKQpsaWJyYXJ5KGNvcnJwbG90KQpjb3JycGxvdChjb3IoZGF0YSksIG1ldGhvZCA9ICJlbGxpcHNlIiwgdHlwZSA9ICJsb3dlciIpCm5hbWVzKGRhdGEpCmBgYAoKYGBge3J9CmxpYnJhcnkoc2NhdHRlcnBsb3QzZCkKc2hhcGVzID0gYygxNiwgMTcsIDE4KSAKc2hhcGVzIDwtIHNoYXBlc1thcy5udW1lcmljKGlyaXMkU3BlY2llcyldCnNjYXR0ZXJwbG90M2QoaXJpc1ssMTozXSwgcGNoID0gc2hhcGVzKQpgYGAKYGBge3J9CmQgPC0gZGF0YVssbmFtZXMoZGF0YSkgJWluJSBjKCJlaWdlbnZhbHVlMiIsICJkZW5zaXR5IiwgImRldGVybWluYW50IildCnNjYXR0ZXJwbG90M2QoZCwgYW5nbGUgPSAxMCkKYGBgCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMCldIDwtICdBdXRvbWF0aWMnCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMSldIDwtICdNYW51YWwnCm10Y2FycyRhbSA8LSBhcy5mYWN0b3IobXRjYXJzJGFtKQoKZCA8LSBkYXRhW3NhbXBsZSgxOm5yb3coZGF0YSksIDEwMDApLF0KCmZpZyA8LSBwbG90X2x5KGQsIHggPSB+ZGV0ZXJtaW5hbnQsIHkgPSB+ZGVuc2l0eSwgeiA9IH5laWdlbnZhbHVlMikKZmlnIDwtIGZpZyAlPiUgYWRkX21hcmtlcnMoc2l6ZSA9IDEpCmZpZyA8LSBmaWcgJT4lIGxheW91dChzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1dlaWdodCcpLAogICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnR3Jvc3MgaG9yc2Vwb3dlcicpLAogICAgICAgICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAnMS80IG1pbGUgdGltZScpKSkKCmZpZwoKYGBgCgoKCmBgYHtyfQpnZ3Bsb3QoZGF0YSkgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZGVuc2l0eSwgeSA9IGVpZ2VudmFsdWUyLCBzaXplID0gYmV0YSwgY29sb3IgPSBzaXplICkpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMSwxKSkgKwogIGxhYnMoeCA9ICJEZW5zaXR5IG9mIEFkamFjZW5jeSBNYXRyaXgiLCB5ID0gVGVYKCIkXFx4aV8yJCBvZiAkVF97UFd9JCIpLCB0aXRsZSA9IFRlWCgiJFxceGlfMiQgb2YgJFRfe1BXfSQiKSApICsKICBndWlkZXMoc2l6ZSA9IEZBTFNFLCBjb2wgPSBGQUxTRSkKYGBgCgoKd2VsbCB0aGUgc3ByZWFkIGlzIGhldGVyb3NrZWRhc3RpYyBzbyBsZXQncyBsb2cgdHJhbnNmb3JtIGl0OgoKCgpgYGB7cn0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gZGVuc2l0eSwgeSA9IGxvZyhlaWdlbnZhbHVlMikpKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHNpemUgPSBzaXplLCBjb2xvciA9IHAsIHNoYXBlID0gZmFjdG9yKG4pKSkgKwojICBzdGF0X3Ntb290aCgpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMSwxLjUpKSArCiAgbGFicyh4ID0gIkRlbnNpdHkgb2YgQWRqYWNlbmN5IE1hdHJpeCIsIHkgPSAiU2Vjb25kIEVpZ2VudmFsdWUgb2YgUG93ZXIgV2FsayBUcmFuc2l0aW9uIFByb2JhYmlsaXR5IE1hdHJpeCIpCmBgYAoKV2UgY291bGQgcHJvYmFibHkgbW9kZWwgdGhpcyB3aXRoIGEgcXVhZHJhdGljOgoKYGBge3J9Cm1vZF94MSA8LSBsbShsb2coZWlnZW52YWx1ZTIpIH4gcG9seShkZW5zaXR5LCAxKSwgZGF0YSA9IGRhdGEpCmRhdGEkeDEgPC0gcHJlZGljdChtb2RfeDEpCgptb2RfeDIgPC0gbG0obG9nKGVpZ2VudmFsdWUyKSB+IHBvbHkoZGVuc2l0eSwgMiksIGRhdGEgPSBkYXRhKQpkYXRhJHgyIDwtIHByZWRpY3QobW9kX3gyKQoKbW9kX3g0IDwtIGxtKGxvZyhlaWdlbnZhbHVlMikgfiBwb2x5KGRlbnNpdHksIDQpLCBkYXRhID0gZGF0YSkKZGF0YSR4NCA8LSBwcmVkaWN0KG1vZF94NCkKCm1vZF94bCA8LSBsbShsb2coZWlnZW52YWx1ZTIpIH4gbG9nKDEtZGVuc2l0eSksIGRhdGEgPSBkYXRhKQpkYXRhJHhsIDwtIHByZWRpY3QobW9kX3hsKQoKbW9kX2RmIDwtIGRhdGEKbW9kX2RmX2xvbmcgPC0gcGl2b3RfbG9uZ2VyKG1vZF9kZiwgY29scyA9IGMoeDEsIHgyLCB4NCwgeGwpLCBuYW1lc190byA9ICJNb2RlbF9UeXBlIiwgdmFsdWVzX3RvID0gImVpZ2VudmFsdWUyX21vZCIpCm1vZF9kZl9sb25nJGVpZ2VudmFsdWUyX2xvZyA8LSBsb2cobW9kX2RmX2xvbmckZWlnZW52YWx1ZTIpCgoKcHJpbnQoYygiTVNFIExpbmVhciIgID0gbWVhbihtb2RfeDEkcmVzaWR1YWxzXjIpLAogICAgICAgICJNU0UgUXVhZHJhdGljIiA9IG1lYW4obW9kX3gyJHJlc2lkdWFsc14yKSwKICAgICAgICAiTVNFIFF1YXJ0aWMiID0gbWVhbihtb2RfeDQkcmVzaWR1YWxzXjIpLAogICAgICAgICJNU0UgTG9nYXJpdGhtaWMiID0gbWVhbihtb2RfeGwkcmVzaWR1YWxzXjIpCiAgICAgICAgKSwgMikKYGBgCgpgYGB7cn0KZ2dwbG90KG1vZF9kZl9sb25nLCBhZXMoeCA9IGRlbnNpdHkpKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGVpZ2VudmFsdWUyX2xvZyksIGZpbGwgPSAibGlnaHRibHVlIiwgY29sID0gImJsYWNrIiwgc2l6ZSA9IDAuMSwgYWxwaGEgPSAwLjIpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IGVpZ2VudmFsdWUyX21vZCwgY29sID0gTW9kZWxfVHlwZSksIHNpemUgPSAwLjkpICsKICBsYWJzKGNvbCA9IGMoIk1vZGVsIFxuVHlwZSIpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiTGluZWFyIiwgIlF1YWRyYXRpYyIsICJRdWFydGljIiwgIkxvZ2FyaXRobWljIikpICsKICBsYWJzKHggPSAiRGVuc2l0eSBvZiBBIiwgeSA9IFRlWCgiJFxcbG9nIFxcbGVmdCggXFx4aV8yIFxccmlnaHQkIG9mICRcXG1hdGhiZntUfSQiKSkgKwogIHRoZW1lX2xpbmVkcmF3KCkKYGBgCgpgYGB7cn0KZGF0YS5mcmFtZSgiTW9kZWwiID0gYygiTGluZWFyIiwgIkxvZ2FyaXRobWljIikpCmdncGxvdCgpCmBgYAoKCmBgYHtyfQojIFRPRE8gQ2hhbmdlIHRoZSBjb2xvdXIgb2YgZWFjaCBtb2RlbCBieSB1c2luZyBwaXZvdF9sb25nZXIKIyBUT0RPIE1ha2UgYSBwbG90IG9mIGRlZ3JlZSB2cyBSU1MsIGNvbW1lbnQgdGhhdCB0aGUgbGFjayBvZiBlbGJvIGlzIGV2aWRlbmNlIHRvIHJlZ2VjdAojIFRPRE8gVHJ5IGEgbmVnYXRpdmUgbG9nLCBhbnkgbHVjaz8gd2l0aCB0aGF0CiMgVE9ETyBEb2VzIHRoaXMgdmFyeSBieSBiZXRhPwojIFRPRE8gV3JpdGUgaXQgdXAgaW4gYSByZXBvcnQKIyBET05FIFdoYXQgYWJvdXQgYSBzcXJ0IHRyYW5zZm9ybSBhbmQgdGhlbiBhIGxpbmVhciBtb2RlbD8KICAjIExlYXZlcyB0b28gbXVjaCB2YXJpYW5jZQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBkZW5zaXR5LCB5ID0gbG9nKGVpZ2VudmFsdWUyKSkpICsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoc2l6ZSA9IHNpemUsIGFscGhhID0gMC4wMSwgIGNvbG9yID0gc2l6ZSwgc2hhcGUgPSBmYWN0b3IobikpKSArCiMgIHN0YXRfc21vb3RoKCkgKwogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC4xLDEuNSkpICsKICBsYWJzKHggPSAiRGVuc2l0eSBvZiBBZGphY2VuY3kgTWF0cml4IFsgbWVhbihBKSBdIiwgeSA9IFRlWCgiJFxcbG9nXFxsZWZ0KCBcXHhpXzIgXFxyaWdodCkkIG9mIFQiKSkgKwogIGdlb21fbGluZShhZXMoeCA9IGRlbnNpdHksIHkgPSB4MSwgbHdkID0gMikpICsKICBnZW9tX2xpbmUoYWVzKHggPSBkZW5zaXR5LCB5ID0geGwsIGx3ZCA9IDMpKSAKIyAgZ2VvbV9saW5lKGFlcyh4ID0gZGVuc2l0eSwgeSA9IHgzLCBsd2QgPSAwLjUpKSArCiMgIGdlb21fbGluZShhZXMoeCA9IGRlbnNpdHksIHkgPSB4NCwgbHdkID0gMC41KSkgKwojICBnZW9tX2xpbmUoYWVzKHggPSBkZW5zaXR5LCB5ID0geDUsIGx3ZCA9IDAuNSkpICsKIyBnZW9tX2xpbmUoYWVzKHggPSBkZW5zaXR5LCB5ID0geDYsIGx3ZCA9IDM2KSkgCgoKCmBgYAojIyMjIExvb2sgYXQgdGhlIFRyYWNlIG9mIFQKCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSB0cmFjZSAsIHkgPSBsb2coZWlnZW52YWx1ZTIpKSkgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyhzaXplID0gc2l6ZSwgY29sb3IgPSBwLCBzaGFwZSA9IGZhY3RvcihuKSkpICsKIyAgc3RhdF9zbW9vdGgoKSArCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjEsMS41KSkgKwogIGxhYnMoeCA9ICJUcmFjZSBvZiBUcmFuc2l0aW9uIE1hdHJpeCIsIHkgPSBUZVgoIiRcXGxvZ1xcbGVmdCggXFx4aV8yIFxccmlnaHQpJCBvZiBcXG1hdGhiZntXfSIpKQpgYGAKCmBgYHtyfQptb2RfZGYgPC0gZGF0YQoKbW9kX2h5cCA8LSBsbShsb2coZWlnZW52YWx1ZTIpIH4gSSh0cmFjZV4oLTEpKSwgZGF0YSA9IGRhdGEpCm1vZF9kZiRoeXAgPC0gcHJlZGljdChtb2RfaHlwKQoKbW9kX2xvZyA8LSBsbShsb2coZWlnZW52YWx1ZTIpIH4gbG9nKHRyYWNlKSwgZGF0YSA9IGRhdGEpCm1vZF9kZiRsb2cgPC0gcHJlZGljdChtb2RfbG9nKQoKYGBgCgpgYGB7cn0KZ2dwbG90KG1vZF9kZiwgYWVzKHggPSB0cmFjZSwgeSA9IGxvZyhlaWdlbnZhbHVlMikpKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHNpemUgPSBzaXplLCBhbHBoYSA9IDAuMDEsICBjb2xvciA9IHNpemUsIHNoYXBlID0gZmFjdG9yKG4pKSkgKwojICBzdGF0X3Ntb290aCgpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMSwxLjUpKSArCiAgbGFicyh4ID0gIlRyYWNlIG9mIEEiLCB5ID0gVGVYKCIkXFxsb2dcXGxlZnQoIFxceGlfMiBcXHJpZ2h0KSQgb2YgVCIpKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gdHJhY2UsIHkgPSBoeXAsIGx3ZCA9IDIpKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gdHJhY2UsIHkgPSBsb2csIGx3ZCA9IDIpKQpgYGAKCmBgYHtyfQoKbW9kX2RmIDwtIGRhdGEKCm1vZF9oeXAgPC0gbG0obG9nKGVpZ2VudmFsdWUyKSB+IDAgKyBJKHRyYWNlXigtMSkpLCBkYXRhID0gZGF0YSkKbW9kX2RmJGh5cCA8LSBwcmVkaWN0KG1vZF9oeXApCgptb2RfbG9nIDwtIGxtKGxvZyhlaWdlbnZhbHVlMikgfiAwICsgbG9nKHRyYWNlKSwgZGF0YSA9IGRhdGEpCm1vZF9kZiRsb2cgPC0gcHJlZGljdChtb2RfbG9nKQoKCm1vZF9kZl9sb25nIDwtIHBpdm90X2xvbmdlcihtb2RfZGYsIGNvbHMgPSBjKGh5cCwgbG9nKSwgbmFtZXNfdG8gPSAiTW9kZWxfVHlwZSIsIHZhbHVlc190byA9ICJlaWdlbnZhbHVlMl9tb2QiKQptb2RfZGZfbG9uZyRlaWdlbnZhbHVlMl9sb2cgPC0gbG9nKG1vZF9kZl9sb25nJGVpZ2VudmFsdWUyKQoKCnByaW50KGMoIk1TRSBIeXBlcmJvbGljIiAgPSBtZWFuKG1vZF9oeXAkcmVzaWR1YWxzXjIpLAogICAgICAgICJNU0UgTG9nYXJpdGhtaWMiID0gbWVhbihtb2RfbG9nJHJlc2lkdWFsc14yKSksIDIpCmBgYAoKCgpgYGB7cn0KCmdncGxvdChtb2RfZGZfbG9uZywgYWVzKHggPSB0cmFjZSkpICsKICBnZW9tX3BvaW50KHNoYXBlID0gMjMsIGFlcyh5ID0gZWlnZW52YWx1ZTJfbG9nKSwgZmlsbCA9ICJsaWdodGJsdWUiLCBjb2wgPSAiYmxhY2siLCBzaXplID0gMC43LCBhbHBoYSA9IDAuNCkgKwogIGdlb21fbGluZShhZXMoeSA9IGVpZ2VudmFsdWUyX21vZCwgY29sID0gTW9kZWxfVHlwZSksIHNpemUgPSAxKSArCiAgbGFicyhjb2wgPSBjKCJNb2RlbCBcblR5cGUiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJIeXBlcmJvbGljIiwgIkxvZ2FyaXRobWljIiksCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImluZGlhbnJlZCIsICJyb3lhbGJsdWUiKSkgKwogIGxhYnMoeCA9ICJUcmFjZSBvZiBBIiwgeSA9IFRlWCgiJFxcbG9nIFxcbGVmdCggXFx4aV8yIFxccmlnaHQkIG9mICRcXG1hdGhiZntUfSQiKSkKICB0aGVtZV9saW5lZHJhdygpCmBgYAoKCgoKIyMjIyBNb2RlbCBDaGkgRGlzdHJpYnV0aW9uCgpOT1BFCgpgYGB7cn0KCmNoaXZhbCA8LSBkY2hpc3Eoc2VxKGZyb20gPSAwLCB0byA9IDQwLCBsZW5ndGgub3V0ID0gMTAwKSwgZGYgPSAxMCkqNwppbmRleCAgPC0gc2VxKGZyb20gPSAwLCB0byA9IDIuMiwgbGVuZ3RoLm91dCA9IDEwMCkKY2hpZGF0YSAgPC0gZGF0YS5mcmFtZShpbmRleCA9IGluZGV4LCBjaGkgPSBjaGl2YWwpCmdncGxvdChkYXRhKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBkZW5zaXR5LCB5ID0gZWlnZW52YWx1ZTIsIHNpemUgPSBiZXRhLCBjb2xvciA9IHNpemUsIHNoYXBlID0gZmFjdG9yKG4pKSkgKwogIGdlb21fbGluZShkYXRhID0gY2hpZGF0YSwgbWFwcGluZyA9IGFlcyh4ID0gaW5kZXgsIHkgPSBjaGkpKSArCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjEsMSkpICsKICBsYWJzKHggPSAiRGVuc2l0eSBvZiBBZGphY2VuY3kgTWF0cml4IiwgeSA9ICJTZWNvbmQgRWlnZW52YWx1ZSBvZiBQb3dlciBXYWxrIFRyYW5zaXRpb24gUHJvYmFiaWxpdHkgTWF0cml4IikKCmBgYAoKCgojIyBMb29raW5nIGF0IERldGVybWluYW50CgoKY29uc3RhbnRzOgoKYGBge3J9Cm4gPC0gMjAKcCA8LSAxOm4vbgpiZXRhIDwtIDE6bi9uCmJldGEgPC0gcnVuaWYobikqMTAwCnN6IDwtICgoMTpuKS9uKSoxMDArMTAKaW5wdXRfdmFyIDwtIGV4cGFuZC5ncmlkKCJuIiA9IG4sICJwIiA9IHAsICJiZXRhIiA9IGJldGEsICJzaXplIiA9IHN6KQpgYGAKCmZ1bmN0aW9uczoKCmBgYHtyfQpyYW5kb21fZ3JhcGggPC0gZnVuY3Rpb24obiwgcCwgYmV0YSwgc2l6ZSkgewogICAgICBnMSA8LSBpZ3JhcGg6OmVyZG9zLnJlbnlpLmdhbWUobiA9IHN6LCBwKQogICAgICBBIDwtIGlncmFwaDo6Z2V0LmFkamFjZW5jeShnMSkgIyBSb3cgdG8gY29sdW1uCiAgICAgIEEgPC0gTWF0cml4Ojp0KEEpCgogICAgICBBX2RlbnMgPC0gbWVhbihBKQogICAgICBUICAgICAgPC0gUGFnZVJhbms6OnBvd2VyX3dhbGtfcHJvYl90cmFucyhBKQogICAgICBlMiAgICAgPC0gZWlnZW4oVCwgb25seS52YWx1ZXMgPSBUUlVFKSR2YWx1ZXNbMl0gIyBSIG9yZGVycyBieSBkZXNjZW5kaW5nIG1hZ25pdHVkZQogICAgICBBX2RldCAgPC0gZGV0KEEpCiAgICAgIHJldHVybihjKGFicyhhYnMoZTIpLTAuNCksIGFicyhBX2RldCksIEFfZGVucykpCn0KYGBgCgpNYXAgdGhlIGZ1bmN0aW9uCgpgYGB7cn0KbmMgPC0gbGVuZ3RoKHJhbmRvbV9ncmFwaCgxLCAxLCAxLCAxKSkKWSA8LSBtYXRyaXgobmNvbCA9IG5jLCBucm93ID0gbnJvdyhpbnB1dF92YXIpKQpmb3IgKGkgaW4gMTpucm93KGlucHV0X3ZhcikpIHsKICBYIDwtIGFzLnZlY3RvcihpbnB1dF92YXJbaSxdKQogIFlbaSxdIDwtICByYW5kb21fZ3JhcGgoWCRuLCBYJHAsIFgkYmV0YSwgWCRzaXplKQp9CmlmIChzdW0oYWJzKFkpICE9IGFicyhSZShZKSkpID09IDApIHsKICBZIDwtIFJlKFkpCn0KbnJvdyhpbnB1dF92YXIpCm5yb3coWSkKWSA8LSBhcy5kYXRhLmZyYW1lKFkpOyBjb2xuYW1lcyhZKSA8LSBjKCJlaWdlbnZhbHVlMiIsICJkZXRlcm1pbmFudCIpCmRhdGEgPC0gY2JpbmQoaW5wdXRfdmFyLCBZKQoKCgpgYGAKCgoKYGBge3J9CmdncGxvdChkYXRhKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBkZXRlcm1pbmFudCwgeSA9IGVpZ2VudmFsdWUyLCBzaXplID0gc2l6ZSwgY29sb3IgPSBiZXRhLCBzaGFwZSA9IGZhY3RvcihuKSkpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMSwxKSkgKwogIGxhYnMoeSA9ICJ8fGUyfC0wLjR8IiwgeCA9IFRlWCgiJFxcbGVmdFxcbHZlcnQgQSBcXHJpZ2h0XFxydmVydCAkIikpCgpgYGAKCmBgYHtyfQpnMSA8LSBpZ3JhcGg6OmVyZG9zLnJlbnlpLmdhbWUobiA9IHN6LCBwKQpjb29yZHMgPC0gbGF5b3V0X3dpdGhfZnIoZzEsIGRpbSA9IDMpCiMgcGxvdChnMSkKcmdscGxvdChnMSwgbGF5b3V0PWNvb3Jkcywgc2l6ZSA9IDAuMSkKYGBgCgoKYGBge3J9CgojIyBOb3QgcnVuOiAKZyA8LSBtYWtlX2xhdHRpY2UoIGMoNSw1LDUpICkKY29vcmRzIDwtIGxheW91dF93aXRoX2ZyKGcsIGRpbT0zKQpyZ2xwbG90KGcsIGxheW91dD1jb29yZHMpCgojIyBFbmQoTm90IHJ1bikKCgoKYGBgCgoKYGBge3J9Cm4gPC0gc3ogPC0gc2l6ZSA8LSAgMTBeMwpwIDwtIDAuCmcxIDwtIGlncmFwaDo6ZXJkb3MucmVueWkuZ2FtZShuID0gc3osIHApCkEgPC0gaWdyYXBoOjpnZXQuYWRqYWNlbmN5KGcxKSAjIFJvdyB0byBjb2x1bW4KQSA8LSBNYXRyaXg6OnQoQSkKZGV0KEEpCgpgYGAKCgpgYGB7cn0KZ2dwbG90KGRhdGEpICsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IHNpemUsIHkgPSBkZXRlcm1pbmFudCwgc2l6ZSA9IHNpemUsIGNvbG9yID0gYmV0YSwgc2hhcGUgPSBmYWN0b3IobikpKSArCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjEsMSkpICsKICBsYWJzKHggPSAic2l6ZSIsIHkgPSAiZGV0ZXJtaW5hbnQiKQoKYGBgCgoKCgoKCgoKIyMgR2V0IERpZmZlcmVudCBEYXRhCgoKY29uc3RhbnRzOgoKYGBge3J9Cm4gPC0gMTAKcCA8LSAxOm4vbgpiZXRhIDwtIDE6bi9uCmJldGEgPC0gcnVuaWYobikqMTAwCnN6IDwtIDE6bi9uKzEwMAppbnB1dF92YXIgPC0gZXhwYW5kLmdyaWQoIm4iID0gbiwgInAiID0gcCwgImJldGEiID0gYmV0YSwgInNpemUiID0gc3opCmBgYAoKZnVuY3Rpb25zOgoKYGBge3J9CnJhbmRvbV9ncmFwaCA8LSBmdW5jdGlvbihuLCBwLCBiZXRhLCBzaXplKSB7CiAgICAgIGcxIDwtIGlncmFwaDo6ZXJkb3MucmVueWkuZ2FtZShuID0gc3osIHApCiAgICAgIEEgPC0gaWdyYXBoOjpnZXQuYWRqYWNlbmN5KGcxKSAjIFJvdyB0byBjb2x1bW4KICAgICAgQSA8LSBNYXRyaXg6OnQoQSkKCiAgICAgIEFfZGVucyA8LSBtZWFuKEEpCiAgICAgIFQgICAgICA8LSBQYWdlUmFuazo6cG93ZXJfd2Fsa19wcm9iX3RyYW5zKEEpCiAgICAgIGUyICAgICA8LSBlaWdlbihULCBvbmx5LnZhbHVlcyA9IFRSVUUpJHZhbHVlc1syXSAjIFIgb3JkZXJzIGJ5IGRlc2NlbmRpbmcgbWFnbml0dWRlCiAgICAgIEFfZGV0ICA8LSBkZXQoQSkKICAgICAgcmV0dXJuKGMoYWJzKGUyKSwgQV9kZXQsIEFfZGVucykpCn0KYGBgCgpNYXAgdGhlIGZ1bmN0aW9uCgpgYGB7cn0KbmMgPC0gbGVuZ3RoKHJhbmRvbV9ncmFwaCgxLCAxLCAxLCAxKSkKWSA8LSBtYXRyaXgobmNvbCA9IG5jLCBucm93ID0gbnJvdyhpbnB1dF92YXIpKQpmb3IgKGkgaW4gMTpucm93KGlucHV0X3ZhcikpIHsKICBYIDwtIGFzLnZlY3RvcihpbnB1dF92YXJbaSxdKQogIFlbaSxdIDwtICByYW5kb21fZ3JhcGgoWCRuLCBYJHAsIFgkYmV0YSwgWCRzaXplKQp9CmlmIChzdW0oYWJzKFkpICE9IGFicyhSZShZKSkpID09IDApIHsKICBZIDwtIFJlKFkpCn0KbnJvdyhpbnB1dF92YXIpCm5yb3coWSkKWSA8LSBhcy5kYXRhLmZyYW1lKFkpOyBjb2xuYW1lcyhZKSA8LSBjKCJlaWdlbnZhbHVlMiIsICJkZXRlcm1pbmFudCIpCmRhdGEgPC0gY2JpbmQoaW5wdXRfdmFyLCBZKQoKCgpgYGAKCgoKYGBge3J9CgpjaGl2YWwgPC0gZGNoaXNxKHNlcShmcm9tID0gMCwgdG8gPSA0MCwgbGVuZ3RoLm91dCA9IDEwMCksIGRmID0gMTApKjcKaW5kZXggIDwtIHNlcShmcm9tID0gMCwgdG8gPSAyLjIsIGxlbmd0aC5vdXQgPSAxMDApCmNoaWRhdGEgIDwtIGRhdGEuZnJhbWUoaW5kZXggPSBpbmRleCwgY2hpID0gY2hpdmFsKQpnZ3Bsb3QoZGF0YSkgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZGV0ZXJtaW5hbnQsIHkgPSBlaWdlbnZhbHVlMiwgc2l6ZSA9IHNpemUsIGNvbG9yID0gYmV0YSwgc2hhcGUgPSBmYWN0b3IobikpKSArCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjEsMSkpICsKICBsYWJzKHggPSAiRGVuc2l0eSBvZiBBZGphY2VuY3kgTWF0cml4IiwgeSA9ICJTZWNvbmQgRWlnZW52YWx1ZSBvZiBQb3dlciBXYWxrIFRyYW5zaXRpb24gUHJvYmFiaWxpdHkgTWF0cml4IikKCmBgYAoKYGBge3J9CmcxIDwtIGlncmFwaDo6ZXJkb3MucmVueWkuZ2FtZShuID0gc3osIHApCmNvb3JkcyA8LSBsYXlvdXRfd2l0aF9mcihnMSwgZGltID0gMykKIyBwbG90KGcxKQojIHJnbHBsb3QoZzEsIGxheW91dD1jb29yZHMsIHNpemUgPSAwLjEpCmBgYAoKCmBgYHtyfQoKIyMgTm90IHJ1bjogCmcgPC0gbWFrZV9sYXR0aWNlKCBjKDUsNSw1KSApCmNvb3JkcyA8LSBsYXlvdXRfd2l0aF9mcihnLCBkaW09MykKcmdscGxvdChnLCBsYXlvdXQ9Y29vcmRzKQoKIyMgRW5kKE5vdCBydW4pCgoKCmBgYAoKCmBgYHtyfQpuIDwtIHN6IDwtIHNpemUgPC0gIDEwMApwIDwtIDAuNApnMSA8LSBpZ3JhcGg6OmVyZG9zLnJlbnlpLmdhbWUobiA9IHN6LCBwKQpBIDwtIGlncmFwaDo6Z2V0LmFkamFjZW5jeShnMSkgIyBSb3cgdG8gY29sdW1uCkEgPC0gTWF0cml4Ojp0KEEpCmRldChBKQpgYGAKCgoK